package qc.module.ehs.api.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import qc.common.core.exception.QCPromptException;
import qc.module.ehs.dto.hazardidentity.HazardIdentifyInfoDto;
import qc.module.ehs.dto.task.TaskScheduleDto;
import qc.module.ehs.dto.taskconsole.TaskConsoleQueryConditionDto;
import qc.module.ehs.dto.task.TaskPaginationQueryResultDto;
import qc.module.ehs.dto.taskconsole.TaskConsoleUnitTaskItemPaginationQueryConditionDto;
import qc.module.ehs.dto.taskconsole.TaskConsoleUnitTaskItemQueryConditionDto;
import qc.module.ehs.dto.taskexecute.TaskExecuteInfoDto;
import qc.module.ehs.dto.taskgroup.TaskGroupItemsDto;
import qc.module.ehs.dto.taskitem.TaskItemInfoDto;
import qc.module.ehs.dto.taskitem.TaskItemPaginationQueryResultDto;
import qc.module.ehs.service.*;

import java.util.List;

/**
 * EHS 任务控制台Controller
 *
 * @author QuCheng Tech
 * @since 2024/11/13
 */
@RestController
@RequestMapping("/taskconsole")
public class TaskConsoleController {
    
    @Autowired
    private EhsTaskInfoService taskInfoService;
    
    @Autowired
    private EhsTaskExecService taskExecService;
    
    @Autowired
    private EhsTaskGroupService taskGroupService;

    @Autowired
    private EhsTaskItemService taskItemService;
    
    @Autowired
    private EhsHazardIdentifyService hazardIdentifyService;

    /**
     * 查询
     * 
     * 分页查询，表格显示任务信息表；
     * 可以根据指定部门进行过滤；指定部门时先在任务分组表中按照责任部门匹配，没有在任务分组中的责任部门的任务不返回；
     * 
     * @param condition 查询条件
     * @return TaskConsoleQueryResultDto
     * @author QuCheng Tech
     * @since 2024/11/18
     */
    @RequestMapping(value = "/query",method = {RequestMethod.POST,RequestMethod.GET})
    public TaskPaginationQueryResultDto query(@RequestBody TaskConsoleQueryConditionDto condition) throws QCPromptException {
        return taskInfoService.query(condition);
    }

    /**
     * 查询指定单元的任务项
     * 
     * 查询指定单元的任务项，不管任务的责任部门和责任人；任务项的状态可以传入1个或多个；
     * 从任务项表中进行查询，查询的结果按照计划截止时间升序排列；
     * 
     * @param condition 查询条件
     * @return TaskConsoleQueryResultDto
     * @author QuCheng Tech
     * @since 2024/11/18
     */
    @RequestMapping(value = "/unititems",method = {RequestMethod.POST,RequestMethod.GET})
    public List<TaskItemInfoDto> queryUnitTaskItems(@RequestBody TaskConsoleUnitTaskItemQueryConditionDto condition) throws QCPromptException {
        return taskItemService.queryUnitTaskItems(condition);
    }

    /**
     * 查询指定单元的分页任务项
     * 
     * 查询指定单元的任务项，不管任务的责任部门和责任人；任务项的状态可以指定1个或多个；
     * 从任务项表中进行查询，查询的结果按照计划开始时间升序排列；结果分页显示；
     *
     * @param condition 查询条件
     * @return TaskConsoleQueryResultDto
     * @author QuCheng Tech
     * @since 2024/11/18
     */
    @RequestMapping(value = "/unititempage",method = {RequestMethod.POST,RequestMethod.GET})
    public TaskItemPaginationQueryResultDto queryPaginationUnitTaskItems(@RequestBody TaskConsoleUnitTaskItemPaginationQueryConditionDto condition) throws QCPromptException {
        return taskItemService.queryPaginationUnitTaskItems(condition);
    }

    /**
     * 查询指定单元的已办任务
     * 
     * 查询指定单元的已办任务，不管任务的责任部门和责任人；
     * 从任务项表中进行查询，查询的结果按照计划开始时间升序排列；
     * 
     * @param condition 查询条件
     * @return TaskConsoleQueryResultDto
     * @author QuCheng Tech
     * @since 2024/11/18
     */
    @RequestMapping(value = "/unitdone",method = {RequestMethod.GET,RequestMethod.POST})
    public TaskItemPaginationQueryResultDto queryUnitDoneTaskItemsByParam(@RequestBody TaskConsoleUnitTaskItemPaginationQueryConditionDto condition) throws QCPromptException {
        return taskInfoService.queryUnitDoneTask(condition);
    }

    /**
     * 查询指定设备设置的待办任务
     * 
     * 查询指定设备设施的待办任务，不管任务的责任部门和责任人；
     * 从任务项表中进行查询，查询的结果按照计划截止时间升序排列；
     * 
     * @param id 设备设施ID
     * @return TaskConsoleQueryResultDto
     * @author QuCheng Tech
     * @since 2024/11/18
     */
    @GetMapping("/facilitytodo")
    public List<TaskItemInfoDto> queryFacilityTodoTaskItemsByParam(@RequestParam String id) throws QCPromptException {
        return taskItemService.queryTodoByFacilityId(id);
    }

    /**
     * 查询指定设备设置的待办任务
     *
     * 查询指定设备设施的待办任务，不管任务的责任部门和责任人；
     * 从任务项表中进行查询，查询的结果按照计划截止时间升序排列；
     *
     * @param id 设备设施ID
     * @return TaskConsoleQueryResultDto
     * @author QuCheng Tech
     * @since 2024/11/18
     */
    @GetMapping("/facilitytodo/{id}")
    public List<TaskItemInfoDto> queryFacilityTodoTaskItemsByPath(@PathVariable String id) throws QCPromptException {
        return taskItemService.queryTodoByFacilityId(id);
    }

    /**
     * 查询指定危险源的待办任务
     * 
     * 查询指定危险源的待办任务，不管任务的责任部门和责任人；
     * 可以用于查询指定隐患的治理任务；
     * 从任务项表中进行查询，查询的结果按照计划截止时间升序排列；
     * 
     * @param id 危险源ID
     * @return TaskConsoleQueryResultDto
     * @author QuCheng Tech
     * @since 2024/11/18
     */
    @GetMapping("/hazardtodo")
    public List<TaskItemInfoDto> queryHazardTodoTaskItemsByParam(@RequestParam String id) throws QCPromptException {
        return taskItemService.queryTodoByHazardId(id);
    }
    
    /**
     * 查询指定危险源的待办任务
     *
     * 查询指定危险源的待办任务，不管任务的责任部门和责任人；
     * 可以用于查询指定隐患的治理任务；
     * 从任务项表中进行查询，查询的结果按照计划截止时间升序排列；
     *
     * @param id 危险源ID
     * @return TaskConsoleQueryResultDto
     * @author QuCheng Tech
     * @since 2024/11/18
     */
    @GetMapping("/hazardtodo/{id}")
    public List<TaskItemInfoDto> queryHazardTodoTaskItemsByPath(@PathVariable String id) throws QCPromptException {
        return taskItemService.queryTodoByHazardId(id);
    }

    /**
     * 查询指定任务的分组和任务项
     * 
     * 查询指定任务的所有分组和每个分组中的任务项集合；按照任务分组--任务项层级关系显示指定任务；
     * 
     * @param id 任务ID
     * @return List<TaskGroupItemsDto>
     * @author QuCheng Tech
     * @since 2024/11/18
     */
    @GetMapping("/groupitems")
    public List<TaskGroupItemsDto> getTaskGroupAndItemsByParam(@RequestParam String id){
        return taskInfoService.getTaskGroupAndItems(id);
    }

    /**
     * 查询指定任务的分组和任务项
     *
     * 查询指定任务的所有分组和每个分组中的任务项集合；按照任务分组--任务项层级关系显示指定任务；
     *
     * @param id 任务ID
     * @return List<TaskGroupItemsDto>
     * @author QuCheng Tech
     * @since 2024/11/18
     */
    @GetMapping("/groupitems/{id}")
    public List<TaskGroupItemsDto> getTaskGroupAndItemsByPath(@PathVariable String id){
        return taskInfoService.getTaskGroupAndItems(id);
    }

    /**
     * 查询指定任务的所有执行记录
     * 
     * 查询指定任务的所有执行记录集合；
     * 不显示任务分组和任务项，所有执行记录以表格方式显示；
     * 执行记录按照执行起始时间升序返回；
     * 
     * @param id 任务ID
     * @return List<TaskExecuteInfoDto>
     * @author QuCheng Tech
     * @since 2024/11/18
     */
    @GetMapping("/taskexecutes")
    public List<TaskExecuteInfoDto> getTaskExecutesByParam(@RequestParam String id){
        return taskExecService.getTaskExecutes(id);
    }
    
    /**
     * 查询指定任务的所有执行记录
     *
     * 查询指定任务的所有执行记录集合；
     * 不显示任务分组和任务项，所有执行记录以表格方式显示；
     * 执行记录按照执行起始时间升序返回；
     *
     * @param id 任务ID
     * @return List<TaskExecuteInfoDto>
     * @author QuCheng Tech
     * @since 2024/11/18
     */
    @GetMapping("/taskexecutes/{id}")
    public List<TaskExecuteInfoDto> getTaskExecutesByPath(@PathVariable String id){
        return taskExecService.getTaskExecutes(id);
    }

    /**
     * 查询指定任务的执行情况一览表
     * 
     * 分组为行，执行周期为列，表格方式显示每个分组每个周期的执行情况；
     * 最后增加一列显示汇总信息，汇总按分组显示完成周期数、超时次数等；
     * 
     * @param id 任务ID
     * @return TaskScheduleDto
     * @author QuCheng Tech
     * @since 2024/11/18
     */
    @GetMapping("/schedule")
    public TaskScheduleDto getTaskScheduleByParam(@RequestParam String id) throws QCPromptException {
        return taskGroupService.getTaskSchedule(id);
    }

    /**
     * 查询指定任务的执行情况一览表
     *
     * 分组为行，执行周期为列，表格方式显示每个分组每个周期的执行情况；
     * 最后增加一列显示汇总信息，汇总按分组显示完成周期数、超时次数等；
     *
     * @param id 任务ID
     * @return TaskScheduleDto
     * @author QuCheng Tech
     * @since 2024/11/18
     */
    @GetMapping("/schedule/{id}")
    public TaskScheduleDto getTaskScheduleByPath(@PathVariable String id) throws QCPromptException {
        return taskGroupService.getTaskSchedule(id);
    }

    /**
     * 查询指定任务的危险源辨识记录
     *
     * @param id 任务ID
     * @return List<HazardIdentifyInfoDto>
     * @author QuCheng Tech
     * @since 2024/11/18
     */
    @GetMapping("/identify")
    public List<HazardIdentifyInfoDto> getTaskIdentifyByParam(@RequestParam String id){
        return hazardIdentifyService.getTaskIdentify(id);
    }

    /**
     * 查询指定任务的危险源辨识记录
     *
     * @param id 任务ID
     * @return List<HazardIdentifyInfoDto>
     * @author QuCheng Tech
     * @since 2024/11/18
     */
    @GetMapping("/identify/{id}")
    public List<HazardIdentifyInfoDto> getTaskIdentifyByPath(@PathVariable String id){
        return hazardIdentifyService.getTaskIdentify(id);
    }
}
